feat: Implement Bloqr landing page — 10 section components, dark design system, SSR-safe persona tabs, a11y hardening#1582
Conversation
Agent-Logs-Url: https://github.com/jaypatrick/adblock-compiler/sessions/6e35bc36-648d-459b-acb4-6e6ac48103d6 Co-authored-by: jaypatrick <[email protected]>
Agent-Logs-Url: https://github.com/jaypatrick/adblock-compiler/sessions/6e35bc36-648d-459b-acb4-6e6ac48103d6 Co-authored-by: jaypatrick <[email protected]>
- Add @fontsource/space-grotesk and @fontsource/inter to package.json - Replace styles.css with Bloqr dark design token system (orange #FF5500, navy #070B14, cyan #00D4FF, Space Grotesk/Inter fonts) - Update index.html with Bloqr title and meta description - Create 10 standalone section components: NavBar, Hero, Problem, Features, HowItWorks, Byo, Audiences, Pricing, CtaBanner, Footer - Rewrite home.component.ts to compose all landing page sections - Update app.component.ts to hide app shell header/footer on landing page - Update tests: app.component.spec.ts (navigate to non-root for hamburger test), home.component.spec.ts (updated for new HomeComponent)" Agent-Logs-Url: https://github.com/jaypatrick/adblock-compiler/sessions/d5bcbec2-627d-45e5-b68c-60d28159d9b1 Co-authored-by: jaypatrick <[email protected]>
…safe persona panels, font preload hint Agent-Logs-Url: https://github.com/jaypatrick/adblock-compiler/sessions/d5bcbec2-627d-45e5-b68c-60d28159d9b1 Co-authored-by: jaypatrick <[email protected]>
|
@copilot resolve the merge conflicts in this pull request |
|
@copilot resolve the merge conflicts in this pull request |
…pi base branch - package.json: take base branch (remove ibm-plex-sans/syne, inter ^5.2.8) - styles.css: take base branch richer token system + append landing page utilities - index.html: take base branch SEO copy + hash-free preload hints - app.component.ts: keep isLandingPage() @if guard, use base branch comment - pnpm-lock.yaml / worker files: take base branch unchanged Build: clean (0 TS errors). Lint: 0 errors (18 pre-existing warnings). Co-authored-by: jaypatrick <[email protected]>
Merge conflicts resolved in fc2e8b0. Conflicts were in 4 files:
Build: ✅ clean. Lint: ✅ 0 errors. |
The merge conflicts were already resolved in commit |
|
@copilot resolve the merge conflicts in this pull request |
The merge conflicts were already fully resolved in commit |
|
@copilot resolve the merge conflicts in this pull request |
…, referrerpolicy) Co-authored-by: jaypatrick <[email protected]>
Merge conflicts with 3 files had conflicts:
Auto-merged cleanly: |
There was a problem hiding this comment.
Pull request overview
Rebuilds the Angular / route into the Bloqr marketing landing page (10 standalone sections) and updates the shared design system + metadata to match the Bloqr dark-first brand, while hiding the existing app shell (header/footer) on the landing route.
Changes:
- Replaces the previous Home dashboard with a 10-section landing page composed from new standalone section components.
- Updates global styling and metadata (fonts, Material M3 tokens, SEO meta) to the Bloqr dark design language.
- Adjusts the app shell to conditionally hide header/footer on
/; updates worker API docs landing styling/copy to match Bloqr branding.
Reviewed changes
Copilot reviewed 15 out of 16 changed files in this pull request and generated 12 comments.
Show a summary per file
| File | Description |
|---|---|
| worker/routes/docs.routes.ts | Updates developer landing page HTML/CSS to Bloqr palette and adds Google Fonts exception. |
| worker/hono-app.ts | Adds X-Powered-By: Bloqr header and updates OpenAPI description copy. |
| pnpm-lock.yaml | Updates locked deps for new font packages; lockfile changes include jose resolution changes. |
| frontend/src/styles.css | Replaces design tokens/fonts for Bloqr dark-first system and adds landing utility classes. |
| frontend/src/index.html | Updates title/SEO meta and adds font preload hints for Bloqr fonts. |
| frontend/package.json | Swaps old font packages for @fontsource/inter + @fontsource/space-grotesk. |
| frontend/src/app/app.component.ts | Adds isLandingPage signal and hides app shell header/footer on /. |
| frontend/src/app/app.component.spec.ts | Updates mobile shell test to navigate off / before asserting hamburger presence. |
| frontend/src/app/home/home.component.ts | Replaces dashboard content with landing-page section composition. |
| frontend/src/app/home/home.component.spec.ts | Updates tests to assert landing components render. |
| frontend/src/app/home/sections/nav-bar/nav-bar.component.ts | Adds fixed glass nav with mobile menu + scroll signal state. |
| frontend/src/app/home/sections/hero-section/hero-section.component.ts | Adds full-viewport hero section with CTA group. |
| frontend/src/app/home/sections/problem-section/problem-section.component.ts | Adds VPN myth framing + comparison cards section. |
| frontend/src/app/home/sections/features-section/features-section.component.ts | Adds 2×2 feature card grid with Material Symbols. |
| frontend/src/app/home/sections/how-it-works-section/how-it-works-section.component.ts | Adds steps + UI/code toggle driven by signal. |
| frontend/src/app/home/sections/byo-section/byo-section.component.ts | Adds BYO vs Ours section layout. |
| frontend/src/app/home/sections/audiences-section/audiences-section.component.ts | Adds persona tabs with all panels SSR-present and visibility toggled. |
| frontend/src/app/home/sections/pricing-section/pricing-section.component.ts | Adds 3-tier pricing grid with highlighted Pro tier. |
| frontend/src/app/home/sections/cta-banner-section/cta-banner-section.component.ts | Adds full-width CTA banner section. |
| frontend/src/app/home/sections/footer-section/footer-section.component.ts | Adds landing footer with multi-column links and brand copy. |
Files not reviewed (1)
- pnpm-lock.yaml: Language not supported
frontend/src/app/home/sections/pricing-section/pricing-section.component.ts
Outdated
Show resolved
Hide resolved
frontend/src/app/home/sections/footer-section/footer-section.component.ts
Outdated
Show resolved
Hide resolved
frontend/src/app/home/sections/audiences-section/audiences-section.component.ts
Show resolved
Hide resolved
frontend/src/app/home/sections/footer-section/footer-section.component.ts
Show resolved
Hide resolved
Co-authored-by: Copilot <[email protected]>
|
@copilot apply changes based on the comments in this thread |
frontend/src/app/home/sections/how-it-works-section/how-it-works-section.component.ts
Outdated
Show resolved
Hide resolved
frontend/src/app/home/sections/footer-section/footer-section.component.ts
Outdated
Show resolved
Hide resolved
frontend/src/app/home/sections/pricing-section/pricing-section.component.ts
Outdated
Show resolved
Hide resolved
frontend/src/app/home/sections/footer-section/footer-section.component.ts
Show resolved
Hide resolved
…coded colors with CSS vars Agent-Logs-Url: https://github.com/jaypatrick/adblock-compiler/sessions/bc4e0af2-97f5-40ba-88d6-3d2533c917a2 Co-authored-by: jaypatrick <[email protected]>
…ntense Agent-Logs-Url: https://github.com/jaypatrick/adblock-compiler/sessions/bc4e0af2-97f5-40ba-88d6-3d2533c917a2 Co-authored-by: jaypatrick <[email protected]>
Applied all open review comments in commits
|
|
@copilot apply changes based on the comments in this thread |
Agent-Logs-Url: https://github.com/jaypatrick/adblock-compiler/sessions/14da966d-12f7-4f2d-b7b2-13e3227e4039 Co-authored-by: jaypatrick <[email protected]>
Applied in commit
|
…troduced by #1582 (#1583) * Initial plan * fix: restore full-featured dashboard, remove landing page sections Agent-Logs-Url: https://github.com/jaypatrick/adblock-compiler/sessions/217b35cf-08ad-41bd-8fd4-5914d80c0aa4 Co-authored-by: jaypatrick <[email protected]> * fix: address code review feedback on home component and specs Agent-Logs-Url: https://github.com/jaypatrick/adblock-compiler/sessions/8527e971-8b1f-4ba3-8f1b-4d5884c0162e Co-authored-by: jaypatrick <[email protected]> --------- Co-authored-by: copilot-swe-agent[bot] <[email protected]> Co-authored-by: jaypatrick <[email protected]>
Rebuilds the Angular 21 home route (
/) from a dev dashboard into the full Bloqr marketing landing page. The app shell (Material sidenav header/footer) is hidden on/via a reactiveisLandingPagesignal; all other routes are unaffected.Description
Rebuilds the Angular 21 home route (
/) from a dev dashboard into the full Bloqr marketing landing page. The app shell (Material sidenav header/footer) is hidden on/via a reactiveisLandingPagesignal; all other routes are unaffected.Changes
New: 10 standalone section components (
frontend/src/app/home/sections/)Section order matches spec exactly: Nav → Hero → Problem/VPN → Features → HowItWorks → BYO → Audiences → Pricing → CTA Banner → Footer
NavBarComponentrgba(7,11,20,0.85)+blur(12px)), scroll-aware, mobile hamburger, signal state; logo served fromassets/logo.svg(locally bundled)HeroSectionComponent100dvh, orange+cyan radial gradient, badge pill, H1/subhead/dual-CTAProblemSectionComponentFeaturesSectionComponentHowItWorksSectionComponentsignal<boolean>; UI mockup labels use<p>(not<label for>) on non-labelable<div role="presentation">elementsByoSectionComponentAudiencesSectionComponentclip-pathtoggle (notdisplay:none) for SEO/AEO correctness; inactive panels receiveinertattribute to prevent keyboard focus entering hidden contentPricingSectionComponentbox-shadowglow; each tier CTA uses a realctaHref(nohref="#"placeholders)CtaBannerSectionComponentFooterSectionComponent© 2026 Bloqr; logo served fromassets/logo.svg; all links wired to real URLsfrontend/src/assets/logo.svg— bundled brand assetBloqr logo SVG shipped with the app under
frontend/src/assets/. BothNavBarComponentandFooterSectionComponentreference it viaassets/logo.svg— eliminates the previous runtime dependency onraw.githubusercontent.com, removes the associated referrer-leakage risk, and ensures compatibility with the SSR worker'simg-src 'self' data:CSP policy.home.component.tsReplaced dev dashboard composition with landing page section imports. Template is a flat list of section selectors. Inner wrapper changed from
<main id="main-content" role="main">to<div class="landing-content">to avoid duplicate landmark and duplicate ID with the app shell's own<main>.styles.css— full design token replacement--mat-sys-*overrides: primary#FF5500, navy background#070B14, cyan secondary#00D4FF; dark-mode tokens scoped tobody.dark-theme/[data-theme='dark']so the existing UI light/dark toggle continues to produce a real visual change@fontsource/interpinned to^5.2.8.bloqr-section,.bloqr-card,.bloqr-btn-primary,.bloqr-btn-ghost,.bloqr-section-label— all brand colors now reference CSS custom properties (no hardcoded hex values); added--color-orange-glow-intensetoken for hover box-shadow--color-*palette, full--mat-sys-*typography/shape tokens, view transitions,.json-viewer, and toast utilitiesapp.component.ts— shell visibility gatingURL is normalised (query params and fragments stripped) before comparison so
/?utm_source=...deep-links are correctly treated as the landing page.initialValuereadsrouter.urlsynchronously so direct deep-links to/compileretc. start with the shell already visible — no flash.app.component.spec.tsMobile viewport test now uses a lightweight
StubComponentfor the/compilerroute instead ofAppComponent, preventing the recursive component tree that the previous config created.index.htmlBloqr title/meta and updated SEO-optimised meta description. Font preload hints intentionally omitted — Angular build uses
outputHashing="all", so hash-less<link rel="preload">hrefs would never match the hashed filenames and would result in wasted 404 prefetches.frontend/package.json+pnpm-lock.yamlRemoved
@fontsource/ibm-plex-sansand@fontsource/syne; updated@fontsource/interto^5.2.8. Added"jose@<6.2.2": "6.2.2"topnpm.overridesand regenerated the lockfile so@better-auth/coreresolves consistently to[email protected]across the entire dependency graph (eliminates the previous[email protected]/[email protected]duplication).worker/routes/docs.routes.tsAdded
referrerpolicy="no-referrer"to all three Google Fonts CDN<link>tags in the API docs landing handler for privacy hardening.Testing
app.component.spec.tsupdated: mobile hamburger test navigates to/compiler(viaStubComponentstub, notAppComponent) before asserting;home.component.spec.tsupdated for new component structure (queries.landing-contentinstead of removed[role="main"])Zero Trust Architecture Checklist
Worker / Backend
*) on write/authenticated endpoints — N/A[vars]) — N/A.prepare().bind()(no string interpolation) — N/AFrontend / Angular
CanActivateFnauth guards — existing guards unchanged; landing page (/) is public by designlocalStorage) — N/A (landing page has no auth state)API Shield / Vulnerability Scanner
operationIdinopenapi.yaml— N/A (no API changes)/{id}path parameters) include asecurity:annotation — N/AWHERE user_id = ?) — N/A404(not403) to avoid leaking resource existence — N/Acloudflare-schema.yamlregenerated ifopenapi.yamlchanged (deno task schema:cloudflare) — N/AOriginal prompt
Clarification on existing PR #1581
This is an amendment to the work already in progress on PR #1581 (
copilot/redesign-angular-frontend-and-api). The original redesign task remains, but the user has clarified:This means the Angular frontend app (specifically the home/landing page at
/—frontend/src/app/home/) must be rebuilt to precisely match the landing page specification inBLOQR_BRAND_HANDOFF.md §5 Page Section OrderandBLOQR_DESIGN_LANGUAGE.md §Landing Page Architecture. The landing page is the primary deliverable that sets the visual standard for the entire app.Landing Page Implementation Requirements
The landing page must implement the v2 recommended section order exactly:
All sections must be in the DOM at SSR time (no client-side-only tab switching) for SEO/AEO correctness.
Section 1: Nav Bar
Fixed, glassmorphic nav bar as specified:
Left side: Bloqr logo (SVG from
https://raw.githubusercontent.com/jaypatrick/bloqr-landing/main/brand/logo.svg) + wordmarkBloqrin Space Grotesk 700.Right side: nav links in Space Grotesk 500, 14px, color
#94A3B8, hover#F1F5F9. Links: Features, How It Works, Audiences, Pricing. Plus a primary CTA button:Get early access(orange,#FF5500).Mobile: hamburger → sidenav drawer with same links.
Section 2: Hero
Full-viewport hero (
min-height: 100dvh), content centered:Structure (from
BLOQR_BRAND_HANDOFF.md §10):Badge/pill — cyan variant:
Now in betaorAI-powered adblock managementH1 headline — from
BLOQR_COPY_PATTERNS.md §2:Subheadline — Space Grotesk 400/500, ~1.25rem, color
#94A3B8:CTA button group:
Join the waitlist(orange, full brand button pattern with glow)See how it works(transparent, border#2A3F5A, hover border#94A3B8)Social proof line (optional, below CTA):
Max content width: 800px, centered.
Section 3: Problem / VPN
Section label (eyebrow):
THE PROBLEMTitle:
You thought you were protected.Description: Uses the VPN myth framing from
BLOQR_DESIGN_LANGUAGE.md §Competitive Positioning: VPNs:Use the section structure pattern:
Below the text, show a 3-column comparison grid (cards) contrasting "What you think a VPN does" vs "What actually protects you":
Cards use the feature tile pattern:
Section 4: Features
Section label:
FEATURESTitle:
Everything you need. Nothing you don't.4 feature cards using
BLOQR_COPY_PATTERNS.md §4 Feature Description Patterns:No setup. No maintenance. / Bloqr builds your filter list automatically and keeps it current.Manage every AdGuard, NextDNS, or Pi-hole instance from a single dashboard.The same rules protect your home network, your phone, and any network you connect to.This pull request was created from Copilot chat.